class SingletonLazy{
    private static SingletonLazy instance = null;//没有volatile 就可能会有重排序的优化
    private static Object locker = new Object();
    public static SingletonLazy getInstance() {
        if (instance == null) {
            synchronized (locker) {
                if (instance == null) {
                    instance = new SingletonLazy();//这一行代码可以细分成三个步骤
                    //1.申请内存空间
                    //2.调用构造方法(对内存空间进行初始化)
                    //3.把此时内存空间的地址,赋值给 Instance 引用
                    //但是在指令重排序的优化下,不一定按照1 2 3执行,可能是1 3 2,但是1一定是先执行的
                    //如果是1 3 2,在3执行完毕后,instance就会被指向一个未初始化的对象,使instance变为非null,此时就无法调用构造函数了
                }
            }
        }
        return instance;
    }
    private SingletonLazy(){

    }
}

public class Demo1 {
    public static void main(String[] args) {
        SingletonLazy s1 = SingletonLazy.getInstance();
        SingletonLazy s2 = SingletonLazy.getInstance();
        System.out.println(s1==s2);//输出 true
    }
}
